// #include <iostream>
// #include <stdio.h>
// #include <pthread.h>
// #include <unistd.h>
// using namespace std;
// // 新线程
// void* Routine(void* _arg)
// {
//     char* msg = (char*)_arg;
//     while(1)
//     {
//         cout << "I am new thread...my name is#" << msg << endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, NULL, Routine, (void*)"thread 1");
//     // 主线程
//     sleep(1);
//     while(1)
//     {
//         cout << "I am main thread...my pid is#" << getpid() << endl;
//         sleep(2);
//     }
//     return 0;
// }

// #include <stdio.h>
// #include <stdlib.h>
// #include <pthread.h>
// #include <unistd.h>
// #include <sys/types.h>


// pthread_t main_pthread;

// void* Routine(void* arg)
// {
//     pthread_detach(pthread_self());
// 	char* msg = (char*)arg;
// 	int count = 0;
// 	while (count < 5)
//     {
// 		printf("I am %s\n", msg);
// 		sleep(1);
// 		count++;
        
// 	}
// 	return (void*)666666;
// }
// int main()
// {
//     main_pthread = pthread_self();

// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++)
//     {
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread_%d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 	}

//    // pthread_cancel(main_pthread);
//    // pthread_exit(nullptr);
// 	// for (int i = 0; i < 5; i++)
//     // {
// 	// 	void* ret;
// 	// 	pthread_join(tid[i], &ret);
// 	// 	printf("thread %d[%lu]...quit, exitcode: %d\n", i, tid[i], (long long int)ret);
// 	// }
//     while(1);
// 	return 0;
// }

// void* Routine(void* arg)
// {
// 	char* msg = (char*)arg;

// 	while (1)
//     {
// 		printf("I am %s\n", msg);
// 		sleep(2);
// 	}

// 	printf("I am %s, exit------------- \n", msg);
// 	return (void*)6;
// }
// int main()
// {
// 	pthread_t tid[5];
// 	for (int i = 0; i < 5; i++)
//     {
// 		char* buffer = (char*)malloc(64);
// 		sprintf(buffer, "thread_%d", i);
// 		pthread_create(&tid[i], NULL, Routine, buffer);
// 	}
	
//     sleep(1);
//     printf("main thread exit..\n");
// 	return 0;
// }



// #include <iostream>
// #include <string>
// #include <unistd.h>
// #include <pthread.h>

// using namespace std;

// void *threadRun(void *arg)
// {
//     cout << "当前次线程的ID为 " << pthread_self() << endl;
//     sleep(1);
//     return nullptr;
// }

// int main()
// {
//     pthread_t t;
//     pthread_create(&t, nullptr, threadRun, nullptr);

//     pthread_join(t, nullptr);
//     cout << "创建的次线程ID为 " << t << endl;

//     return 0;
// }


#include <iostream>
#include <string>
#include <unistd.h>
#include <pthread.h>

using namespace std;


__thread int g_val = 100;

string toHex(pthread_t t)
{
    char id[64];
    snprintf(id, sizeof(id), "0x%x", t);
    return id;
}

void *threadRun(void *arg)
{
    cout << "thread: " << toHex(pthread_self()) << " g_val: " << ++g_val << " &g_val: " << &g_val << endl;
    return (void*)0;
}

int main()
{
    pthread_t t[5];
    for(int i = 0; i < 5; i++)
    {
        pthread_create(t + i, nullptr, threadRun, nullptr);
        sleep(1);
    }

    for(int i = 0; i < 5; i++)
        pthread_join(t[i], nullptr);
    return 0;
}

